package com.it.blog.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.it.blog.entity.*;
import com.it.blog.service.ArticleService;
import com.it.blog.service.BackAdminService;
import com.it.blog.service.WebsiteConfigService;
import com.it.blog.tools.Md5Tools;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.List;

/**
 * @Author: 羡羡
 * @Date: 2022/02/22/08:35
 */
@Controller
@SessionAttributes({"aduser"})
@RequestMapping("/admin")
public class AdminController {
    @Autowired
    BackAdminService base;

    @Autowired
    ArticleService arse;

    @Autowired
    WebsiteConfigService webse;

    @GetMapping({"/log"})
    public  String adminlogin(){
        return "backstatic/login";
    }

    /**
     * 后台管理员登入
     * @param username
     * @param password
     * @return
     * @throws NoSuchAlgorithmException
     */
    @PostMapping("/login")
    public String fromsubim(String username, String password, ModelMap mp) throws NoSuchAlgorithmException {
        System.out.println(username+" "+password);
        Admin ad=new Admin();
        //设置账号
        ad.setUsaction(username);
        //加密转码
        ad.setUspass(Md5Tools.getmdresult(password));
        //调用登入的方法
        Admin alg=base.loginad(ad);
        System.out.println(alg);
        if(alg!=null){
            //查询整个网站的信息
            WebsiteConfig web=webse.webconfigall();
            //发送到前台
            mp.put("webconfig",web);
            //得到运行的时间
            String time=webse.GetComTime();
            //把计算的时间发送到前台
            mp.put("time",time);
            //获取到文章的观看总数
            int wacount=arse.blogwacount();
            //把总观看数发送前台
            mp.put("wacount",wacount);
            //用户信息发送前台
            mp.put("aduser",alg);
            return "backstatic/index";
        }else{
            mp.put("err",500);
            return "backstatic/login";
        }
    }

    /**
     * 退出
     * @param start
     * @return
     */
    @GetMapping("/logout")
    public String logout(SessionStatus start){
        System.out.println("退出登入！");
        start.setComplete();
        return "redirect:/admin/log";
    }

    /**
     * 进入主页博客
     * @param mp
     * @param pagenum
     * @return
     */
    @GetMapping("/adblog")
    public String adblog(ModelMap mp,@RequestParam(defaultValue = "1") int pagenum){
        //查询所有的类别
        List alltype=base.alltype();
        //类别发送前台
        mp.put("alltp",alltype);
        //查询整个网站的信息
        WebsiteConfig web=webse.webconfigall();
        //发送到前台
        mp.put("webconfig",web);
        //得到运行的时间
        String time=webse.GetComTime();
        //把计算的时间发送到前台
        mp.put("time",time);
        //获取到文章的观看总数
        int wacount=arse.blogwacount();
        //把总观看数发送前台
        mp.put("wacount",wacount);
        PageHelper.startPage(pagenum,10);
        //得到所有的信息
        List ls=base.admllblog();
        //定义分页栏的长度
        PageInfo pa=new PageInfo(ls,10);
        mp.put("pali",pa);
        return "backstatic/blogs";
    }

    /**
     * 搜索
     * @param title 搜索的标题
     * @param typeId 搜索类别的ID
     * @param mp
     * @param pagenum 当前页
     * @return
     */
    @GetMapping("/adsearch")
    public String adsearch(String title,@RequestParam(defaultValue = "0")int typeId,ModelMap mp,@RequestParam(defaultValue = "1") int pagenum){
        //查询所有的类别
        List alltype=base.alltype();
        //类别发送前台
        mp.put("alltp",alltype);
        //查询整个网站的信息
        WebsiteConfig web=webse.webconfigall();
        //发送到前台
        mp.put("webconfig",web);
        //得到运行的时间
        String time=webse.GetComTime();
        //把计算的时间发送到前台
        mp.put("time",time);
        //获取到文章的观看总数
        int wacount=arse.blogwacount();
        //把总观看数发送前台
        mp.put("wacount",wacount);
        PageHelper.startPage(pagenum,10);
        //得到所有的信息
        List lis=base.adsearch(title,typeId);
        //定义分页栏的长度
        PageInfo pa=new PageInfo(lis,10);
        mp.put("pali",pa);
        //搜索过的状态
        mp.put("statue",400);
        //传title和typeId
        mp.put("tit",title);
        mp.put("tyid",typeId);
        return "backstatic/blogs";
    }

    /**
     * 删除博客
     * @param bid 博客ID
     * @return
     */
    @GetMapping("/delblog/{bid}")
    public String delblog(@PathVariable("bid") int bid,RedirectAttributes attributes){
        //删除博客
        int desu=base.delblog(bid);
        if(desu>0){
            //传值提示删除成功
            attributes.addFlashAttribute("message", "删除成功！");
        }else{
            //传值提示删除失败
            attributes.addFlashAttribute("message", "删除失败！");
        }
        return "redirect:/admin/adblog";
    }


    /**
     * 进入编写博客界面
     * @param mp
     * @return
     */
    @GetMapping("/bloginput")
    public String inputblog(ModelMap mp){
        //查询整个网站的信息
        WebsiteConfig web=webse.webconfigall();
        //发送到前台
        mp.put("webconfig",web);
        //得到运行的时间
        String time=webse.GetComTime();
        //把计算的时间发送到前台
        mp.put("time",time);
        //获取到文章的观看总数
        int wacount=arse.blogwacount();
        //把总观看数发送前台
        mp.put("wacount",wacount);
        //查询所有的类别
        List alltype=base.alltype();
        //类别发送前台
        mp.put("alltp",alltype);
        //所有的标签
        List alab=base.alable();
        mp.put("alis",alab);
        //新建的时候没有数据 从新new一个空的
        mp.put("article",new Article());
        return "backstatic/blogs-input";
    }

    /**
     * 博客编辑
     * @param blogid 博客ID
     * @param mp
     * @return
     */
    @GetMapping("/blogin/{blogid}")
    public String editblog(@PathVariable("blogid")int blogid,ModelMap mp){
        //查询整个网站的信息
        WebsiteConfig web=webse.webconfigall();
        //发送到前台
        mp.put("webconfig",web);
        //得到运行的时间
        String time=webse.GetComTime();
        //把计算的时间发送到前台
        mp.put("time",time);
        //获取到文章的观看总数
        int wacount=arse.blogwacount();
        //把总观看数发送前台
        mp.put("wacount",wacount);
        //查询所有的类别
        List alltype=base.alltype();
        //类别发送前台
        mp.put("alltp",alltype);
        //所有的标签
        List alab=base.alable();
        mp.put("alis",alab);
        //查询指定的博客
        Article article=base.findadblog(blogid);
        mp.put("article",article);
        return "backstatic/blogs-input";
    }

    /**
     * 编辑博客、新建博客
     * @param title 标题
     * @param content 内容
     * @param typeid 类别ID
     * @param tagIds 标签ID
     * @param firstPicture 首页的图片
     * @param attributes
     * @return
     */
    @PostMapping("/addblog")
    public String issue(int id,String title,String content,int watch,int typeid,int tagIds,String firstPicture,String description,String published,RedirectAttributes attributes){
        //判断是新建 还是 编辑
        if (id==0){
            Article ar;
            //判断是保存还是发布
            if ("true".equals(published)) {
                //发布
                ar=new Article(title,firstPicture,content,typeid,tagIds,description,1,watch,new Date());
            }else{
                //保存
                ar=new Article(title,firstPicture,content,typeid,tagIds,description,0,watch,new Date());
            }
            //执行添加
            int adsu=base.addblog(ar);
            if(adsu>0){
                attributes.addFlashAttribute("message", "发布成功！");
                return "redirect:/admin/adblog";
            }else{
                attributes.addFlashAttribute("message", "发布失败！");
                System.out.println("发布失败！");
                return "redirect:/admin/bloginput";
            }
        }else {
            //编辑
            Article upar;
            //判断是保存还是发布
            if("true".equals(published)){
                //发布
                upar=new Article(id,title,firstPicture,content,typeid,tagIds,description,1,watch,new Date());
            }else{
                //保存
                upar=new Article(id,title,firstPicture,content,typeid,tagIds,description,0,watch,new Date());
            }
            int upsu=base.uparticle(upar);
            if(upsu>0){
                attributes.addFlashAttribute("message", "更新成功！");
                return "redirect:/admin/adblog";
            }else{
                attributes.addFlashAttribute("message", "更新失败！");
                return "redirect:/admin/bloginput";
            }
        }
    }

    /**
     * 进入标签页
     * @return
     */
    @GetMapping("/tagele")
    public String tagelad(ModelMap mp,@RequestParam(defaultValue = "1")int pagenum){
        //查询整个网站的信息
        WebsiteConfig web=webse.webconfigall();
        //发送到前台
        mp.put("webconfig",web);
        //得到运行的时间
        String time=webse.GetComTime();
        //把计算的时间发送到前台
        mp.put("time",time);
        //获取到文章的观看总数
        int wacount=arse.blogwacount();
        //把总观看数发送前台
        mp.put("wacount",wacount);
        PageHelper.startPage(pagenum,10);
        //查询所有的标签
        List adlable=base.adallabl();
        //定义分页栏的长度
        PageInfo pa=new PageInfo(adlable,10);
        mp.put("adlbe",pa);
        return "backstatic/tags";
    }

    /**
     * 删除标签
     * @param tagid
     * @param attributes
     * @return
     */
    @GetMapping("/deblogtag/{tagid}")
    public String deblogtag(@PathVariable("tagid") int tagid,RedirectAttributes attributes){
        System.out.println(tagid);
        //查询该标签下的文章
        List lis=base.dseblog(tagid);
        //如果有就不能删除
        if(lis.size()>0){
            //有文章
            attributes.addFlashAttribute("message", "删除失败，该标签下有 "+lis.size()+" 篇文章！");
        }else{
            //没有文章执行删除
            int desu=base.detagle(tagid);
            if(desu>0){
                attributes.addFlashAttribute("message", "删除成功！");
            }else{
                attributes.addFlashAttribute("message", "删除失败！");
            }
        }
        return  "redirect:/admin/tagele";
    }

    /**
     * 进入标签输入界面 新建标签
     * @param mp
     * @return
     */
    @GetMapping("/tagadd")
    public String tagaddup(ModelMap mp){
        //查询整个网站的信息
        WebsiteConfig web=webse.webconfigall();
        //发送到前台
        mp.put("webconfig",web);
        //得到运行的时间
        String time=webse.GetComTime();
        //把计算的时间发送到前台
        mp.put("time",time);
        //获取到文章的观看总数
        int wacount=arse.blogwacount();
        //把总观看数发送前台
        mp.put("wacount",wacount);
        //进入是没有 new一个空的对象传值
        mp.put("albtag",new ArticleLable());
        return "backstatic/tags-input";
    }

    /**
     * 表单 添加、编辑 标签
     * @param id
     * @param name
     * @param attributes
     * @return
     */
    @PostMapping("/adtagupda")
    public String adtagupda(int id,String name,RedirectAttributes attributes){
        //判断是编辑 还是 新建
        if(id==0){
            //新建
            ArticleLable atg=new ArticleLable(name);
            //执行添加
            int at=base.adtage(atg);
            if(at>0){
                attributes.addFlashAttribute("message", "添加成功！");
            }else{
                attributes.addFlashAttribute("message", "添加成功！");
            }
        }else{
            //编辑
            ArticleLable arge=new ArticleLable(id,name);
            //执行修改
            int uptag=base.uptag(arge);
            if(uptag>0){
                attributes.addFlashAttribute("message", "更新成功！");
            }else{
                attributes.addFlashAttribute("message", "更新成功！");
            }
        }
        return "redirect:/admin/tagele";
    }

    /**
     * 编辑标签
     * @param tagid 标签ID
     * @param mp
     * @return
     */
    @GetMapping("/editage/{tagid}")
    public String editagle(@PathVariable("tagid")int tagid,ModelMap mp){
        //查询整个网站的信息
        WebsiteConfig web=webse.webconfigall();
        //发送到前台
        mp.put("webconfig",web);
        //得到运行的时间
        String time=webse.GetComTime();
        //把计算的时间发送到前台
        mp.put("time",time);
        //获取到文章的观看总数
        int wacount=arse.blogwacount();
        //把总观看数发送前台
        mp.put("wacount",wacount);
        //查询到指定标签ID的信息
        ArticleLable alb=base.findtag(tagid);
        mp.put("albtag",alb);
        return "backstatic/tags-input";
    }

    /**
     * 进入类别页
     * @param mp
     * @return
     */
    @GetMapping("/gototype")
    public String gototype(ModelMap mp,@RequestParam(defaultValue = "1")int pagenum){
        //查询整个网站的信息
        WebsiteConfig web=webse.webconfigall();
        //发送到前台
        mp.put("webconfig",web);
        //得到运行的时间
        String time=webse.GetComTime();
        //把计算的时间发送到前台
        mp.put("time",time);
        //获取到文章的观看总数
        int wacount=arse.blogwacount();
        //把总观看数发送前台
        mp.put("wacount",wacount);
        PageHelper.startPage(pagenum,10);
        //查询所有的类别
        List adtype=base.altype();
        //定义分页栏的长度
        PageInfo pa=new PageInfo(adtype,10);
        mp.put("tylis",pa);
        return "backstatic/types";
    }

    /**
     * 删除类别
     * @param typeid 类别ID
     * @param attributes
     * @return
     */
    @GetMapping("/detype/{typeid}")
    public String deltype(@PathVariable("typeid")int typeid,RedirectAttributes attributes) {
        System.out.println(typeid);
       List tylis=base.findtype(typeid);
       if(tylis.size()>0){
           //有文章
           attributes.addFlashAttribute("message", "删除失败，该文章下有 "+tylis.size()+" 篇文章！");
       }else{
           //没有文章
           int dety=base.detype(typeid);
           if(dety>0){
               attributes.addFlashAttribute("message", "删除成功！");
           }else{
               attributes.addFlashAttribute("message", "删除成功！");
           }
       }
       return "redirect:/admin/gototype";
    }

    /**
     * 编辑类别
     * @param typeid 类别ID
     * @param mp
     * @return
     */
    @GetMapping("/gotoedit/{typeid}")
    public String edittype(@PathVariable("typeid")int typeid,ModelMap mp){
        //查询整个网站的信息
        WebsiteConfig web=webse.webconfigall();
        //发送到前台
        mp.put("webconfig",web);
        //得到运行的时间
        String time=webse.GetComTime();
        //把计算的时间发送到前台
        mp.put("time",time);
        //获取到文章的观看总数
        int wacount=arse.blogwacount();
        //把总观看数发送前台
        mp.put("wacount",wacount);
        //通过id查询类别的信息
        ArticleType arty=base.typeinfo(typeid);
        mp.put("arty",arty);
        return "backstatic/types-input";
    }

    /**
     * 新建类别
     * @param mp
     * @return
     */
    @GetMapping("/newtype")
    public String newtype(ModelMap mp){
        //查询整个网站的信息
        WebsiteConfig web=webse.webconfigall();
        //发送到前台
        mp.put("webconfig",web);
        //得到运行的时间
        String time=webse.GetComTime();
        //把计算的时间发送到前台
        mp.put("time",time);
        //获取到文章的观看总数
        int wacount=arse.blogwacount();
        //把总观看数发送前台
        mp.put("wacount",wacount);
        //通过id查询类别的信息
        mp.put("arty",new ArticleType());
        return "backstatic/types-input";
    }

    /**
     * 编辑 新建 表单提交
     * @param id 博客ID
     * @param name 博客类别名字
     * @param attributes
     * @return
     */
    @PostMapping("/newuptype")
    public String newuptype(int id,String name,RedirectAttributes attributes){
        //判断是新建 还是 编辑
        if(id==0){
            //新建
            ArticleType ar=new ArticleType(name);
            //执行添加
           int adsu= base.addtype(ar);
           if(adsu>0){
               attributes.addFlashAttribute("message", "添加成功！");
           }else{
                attributes.addFlashAttribute("message", "添加失败！");
            }
        }else{
            //编辑
            ArticleType ary=new ArticleType(id,name);
            //执行修改
            int upsu=base.uptype(ary);
            if(upsu>0){
                attributes.addFlashAttribute("message", "更新成功！");
            }else{
                attributes.addFlashAttribute("message", "更新成功！");
            }
        }
        return "redirect:/admin/gototype";
    }
}
